package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.impl.EmployeeServiceImpl;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;

//controller注解和ResponseBody注解
//ResponseBody让返回值为json数据
@RestController
//请求地址
@RequestMapping("/employee")
public class EmployeeController {
    //注入依赖自动装配创建业务层对象 可以调用增删改查方法
    @Autowired
    EmployeeServiceImpl employeeService = new EmployeeServiceImpl();

    //2.根据用户名查询用户信息：select * from where username=?
    @PostMapping("/login")//登录方法        //请求参数为JSON接收页面传过来的数据 用对象接收数据
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) {
        //判断查询不到，返回登陆失败
        //建一个mp的条件构造器 可以过滤条件
        QueryWrapper<Employee> qw = new QueryWrapper<>();
        //拿到前端上的数据
        String password = employee.getPassword();
        //加密方法 把密码进行加密 准备和数据库密码进行匹配{因为数据库保存的密码是加密过的}
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        //查询到了比对用户名是否和数据库匹配的上
        qw.lambda().eq(Employee::getUsername, employee.getUsername());
        //调用getOne方法（只返回一个对象）
        Employee emp = employeeService.getOne(qw);
        //判断比对失败啊返回登陆失败
        if (emp == null) {
            //如果为空说明username没匹配上
            return R.error("用户不存在登陆失败");
        }
        //比对密码是否正确
        if (!emp.getPassword().equals(password)) {
            //比对密码是否匹配的上
            return R.error("密码错误登录失败");
        }
        //判断用户是否禁用【status"0禁用1正常】.禁用返回登录失败【返回员工已禁用】
        if (emp.getStatus() == 0) {
            return R.error("账号已禁用");
        }
        //用户正常 正常登录
        //存用户信息[只存用户的id]到session     因为前端传来的数据id没有值所以要用查出来的这个id
        request.getSession().setAttribute("employee",emp.getId());
        return R.success(emp, "登陆成功");
    }

    //请求uri为logout对应前端退出方法
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request) {
        //拿到登录存取的session调用销毁session方法
        request.getSession().invalidate();
        //返回退出成功方法
        return R.success("", "退出成功");
    }

    //对应post请求 添加方法没有具体uri
    //添加方法
    @PostMapping
    public R addEmployee(HttpServletRequest request, HttpServletResponse response, @RequestBody Employee employee) {
        //把初始密码进行加密因为数据库存的都是加密过的密码
        String password = DigestUtils.md5DigestAsHex("123456".getBytes());
        //拿到登录过的session从域中取出存入的id放入对象的创建人和修改人
        //Long id = (Long) request.getSession().getAttribute("employee");
        //存入页面没添加的数据
        employee.setPassword(password);
        /*employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());
        employee.setUpdateUser(id);
        employee.setCreateUser(id);*/
        //调用mp的添加方法
        employeeService.save(employee);
        //返回添加成功
        return R.success("", "添加成功，初始密码是123456");
    }

    //分页显示展示
    @GetMapping("/page")
    public R<HashMap> getPage(Integer page, Integer pageSize, String name) {
        // 创建IPage分页对象,设置分页参数
        Page<Employee> employeePage = new Page<>(page, pageSize);
        //条件过滤对象
        QueryWrapper<Employee> qw = new QueryWrapper<>();
        //因为页面有搜索查询所以这里模糊查询[调用工具StringUtils判断name不为空]
        qw.lambda().like(StringUtils.isNotEmpty(name), Employee::getName, name);
        //设置为创建时间排序
        qw.lambda().orderByDesc(Employee::getUpdateTime);
        // 执行分页查询 [一定先执行分页查询再从分页对象拿东西]
        employeeService.page(employeePage, qw);
        //拿到要几个对象
        long total = employeePage.getTotal();
        //拿到查出来的集合
        List<Employee> records = employeePage.getRecords();
        HashMap map = new HashMap();
        map.put("total", total);
        map.put("records", records);
        //return R.success(employeePage,"");
        return R.success(map);
    }

    //根据修改状态[前端的请求为put]
    @PutMapping
    //因为要设置修改人所以还需要session对象
    public R<String> update(HttpSession session, @RequestBody Employee employee) {
        //拿到修改人id
        //Long id = (Long) session.getAttribute("employee");
        //  employee.setUpdateTime(LocalDateTime.now());
        //这里有个精度损失 前端拿到的id和后端不一致因为后端的Long长 需要创建一个jackson设置类序列化配置一下
        // employee.setUpdateUser(id);
        //调用方法
        employeeService.updateById(employee);
        //返回
        return R.success("", "状态修改成功");
    }

    //根据id查询方法并回显[前端的请求为get?....所以用PathVariable路经参数]
    @GetMapping("/{id}")
    public R xiuGai(@PathVariable Long id) {
        //根据id返回要回响的对象查出来的
        Employee employee = employeeService.getById(id);
        //如果不为空查出来有东西
        if (employee != null) {
            //传递对象并显示成功
            return R.success(employee, "成功");
        }
        //如果为空就是没查到说明代码有问题
        return R.error("失败");
    }

}
